package cn.ryh.designpatterndemo.templatemethodpattern;

/**
 * @ClassName CarTemplateMethod
 * @Description 模拟模板方法
 * @Author RaoYH
 * @Date 2019/4/22
 *
 * 汽车模板
 */
public abstract class CarTemplateMethod {

    // 基本方法--可由客户决定是否需要执行
    protected abstract void doSomething();

    // 基本方法--默认都会执行
    protected abstract void doAnything();

    //模板方法
    final public void templateMethod() {
        /*
         * 调用基本方法，完成相关的逻辑
         */
        this.doAnything();

        // 根据钩子方法判断需要执行的方法
        if (this.isAlarm()) {
            this.doSomething();
        }

    }
    // 钩子方法,默认会执行
    protected boolean isAlarm() {
        return true;
    }
}
